/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package model.dao;

import lib.*;
import model.dao.vo.*;

import java.sql.*;
import java.util.*;

/**
 *
 * @author felipe
 */
public class FilmeDAO extends DAO {

    public FilmeDAO()
    {
        super();
    }

    public Iterator<FilmeVO> listafilme(CategoriaVO categoria)
    {
        SQL sql = Factory.createSQL();
        sql = sql.select("filme_id, categoria_id, filme_nome, filme_enredo, ator_id, diretor_id, filme_lancamento, filme_cadastro")
                .from("filme")
                .where("categoria_id = " + categoria.getId());
        ResultSet rs = this.db.Execute(sql.toString());
        try
        {
            if ( ! rs.wasNull() )
            {
                List<FilmeVO> filmes = new ArrayList<FilmeVO>();
                while(rs.next())
                {
                    FilmeVO f = new FilmeVO();
                    f.setId(rs.getInt("filme_id"));
                    f.setNome(rs.getString("filme_nome"));
                    f.setEnredo(rs.getString("filme_enredo"));
                    f.setCategoria(categoria);
                    filmes.add(f);
                }

                if ( ! filmes.isEmpty()){
                    return (Iterator<FilmeVO>) filmes.iterator();
                }
            }
        }
        catch( SQLException e )
        {
            ErrorLog.SQLLog("Error Main method " , e);
        }
        return null;
    }

    public Iterator<FilmeVO> listaFilme(FilmeVO filme)
    {
        SQL sql = Factory.createSQL();
        sql = sql.select("filme_id, categoria_id, filme_nome, filme_enredo, ator_id, diretor_id, filme_lancamento, filme_cadastro")
                .from("filme")
                .where("filme_nome LIKE '%" + filme.getNome() + "%'");
        ResultSet rs = this.db.Execute(sql.toString());
        try
        {
            if ( ! rs.wasNull() )
            {
                List<FilmeVO> filmes = new ArrayList<FilmeVO>();
                while(rs.next())
                {
                    FilmeVO f = new FilmeVO();
                    f.setId(rs.getInt("filme_id"));
                    int categoria = rs.getInt("categoria_id");
                    CategoriaVO categoriaVO = new CategoriaVO();
                    categoriaVO.setId(categoria);
                    CategoriaDAO categoriaDAO = new CategoriaDAO();
                    categoriaVO = categoriaDAO.buscaCategoria(categoriaVO);
                    f.setCategoria(categoriaVO);
                    f.setNome(rs.getString("filme_nome"));
                    f.setEnredo(rs.getString("filme_enredo"));
                    int ator = rs.getInt("ator_id");
                    AtorVO atorVO = new AtorVO();
                    atorVO.setId(ator);
                    AtorDAO atorDAO = new AtorDAO();
                    atorVO = atorDAO.buscaAtor(atorVO);
                    f.setAtor(atorVO);
                    int diretor = rs.getInt("diretor_id");
                    DiretorVO diretorVO = new DiretorVO();
                    diretorVO.setId(diretor);
                    DiretorDAO diretorDAO = new DiretorDAO();
                    diretorVO = diretorDAO.buscaDiretor(diretorVO);
                    f.setDiretor(diretorVO);
                    filmes.add(f);
                }
                if ( ! filmes.isEmpty()){
                    return (Iterator<FilmeVO>) filmes.iterator();
                }
            }
        }
        catch( SQLException e )
        {
            ErrorLog.SQLLog("Error Main method " , e);
        }
        return null;
    }

    public Iterator<FilmeVO> listaFilme(AtorVO ator)
    {
        SQL sql = Factory.createSQL();
        sql = sql.select("filme_id, categoria_id, filme_nome, filme_enredo, ator_id, diretor_id, filme_lancamento, filme_cadastro")
                .from("filme")
                .where("ator_id = " + ator.getAtorId());
        ResultSet rs = this.db.Execute(sql.toString());
        try
        {
            if ( ! rs.wasNull() )
            {
                List<FilmeVO> filmes = new ArrayList<FilmeVO>();
                while(rs.next())
                {
                    FilmeVO f = new FilmeVO();
                    f.setId(rs.getInt("filme_id"));
                    int categoria = rs.getInt("categoria_id");
                    CategoriaVO categoriaVO = new CategoriaVO();
                    categoriaVO.setId(categoria);
                    CategoriaDAO categoriaDAO = new CategoriaDAO();
                    categoriaVO = categoriaDAO.buscaCategoria(categoriaVO);
                    f.setCategoria(categoriaVO);
                    f.setNome(rs.getString("filme_nome"));
                    f.setEnredo(rs.getString("filme_enredo"));
                    f.setAtor(ator);
                    int diretor = rs.getInt("diretor_id");
                    DiretorVO diretorVO = new DiretorVO();
                    diretorVO.setId(diretor);
                    DiretorDAO diretorDAO = new DiretorDAO();
                    diretorVO = diretorDAO.buscaDiretor(diretorVO);
                    f.setDiretor(diretorVO);
                    filmes.add(f);
                }
                if ( ! filmes.isEmpty()){
                    return (Iterator<FilmeVO>) filmes.iterator();
                }
            }
        }
        catch( SQLException e )
        {
            ErrorLog.SQLLog("Error Main method " , e);
        }
        return null;
    }

    public Iterator<FilmeVO> listaFilme(DiretorVO diretor)
    {
        SQL sql = Factory.createSQL();
        sql = sql.select("filme_id, categoria_id, filme_nome, filme_enredo, ator_id, diretor_id, filme_lancamento, filme_cadastro")
                .from("filme")
                .where("diretor_id = " + diretor.getDiretorId());
        ResultSet rs = this.db.Execute(sql.toString());
        try
        {
            if ( ! rs.wasNull() )
            {
                List<FilmeVO> filmes = new ArrayList<FilmeVO>();
                while(rs.next())
                {
                    FilmeVO f = new FilmeVO();
                    f.setId(rs.getInt("filme_id"));
                    int categoria = rs.getInt("categoria_id");
                    CategoriaVO categoriaVO = new CategoriaVO();
                    categoriaVO.setId(categoria);
                    CategoriaDAO categoriaDAO = new CategoriaDAO();
                    categoriaVO = categoriaDAO.buscaCategoria(categoriaVO);
                    f.setCategoria(categoriaVO);
                    f.setNome(rs.getString("filme_nome"));
                    f.setEnredo(rs.getString("filme_enredo"));
                    int ator = rs.getInt("ator_id");
                    AtorVO atorVO = new AtorVO();
                    atorVO.setId(ator);
                    AtorDAO atorDAO = new AtorDAO();
                    atorVO = atorDAO.buscaAtor(atorVO);
                    f.setAtor(atorVO);
                    f.setDiretor(diretor);
                    filmes.add(f);
                }
                if ( ! filmes.isEmpty()){
                    return (Iterator<FilmeVO>) filmes.iterator();
                }
            }
        }
        catch( SQLException e )
        {
            ErrorLog.SQLLog("Error Main method " , e);
        }
        return null;
    }

    public boolean insereFilme(FilmeVO filme)
    {
        SQL sql = Factory.createSQL();
        sql = sql.insert()
                .into( "filme","filme_id, categoria_id, filme_nome, filme_enredo, ator_id, diretor_id, filme_lancamento, filme_cadastro")
                .value("NULL, " + filme.getCategoria().getId() + ",'" + filme.getNome() + "', '" + filme.getEnredo() + "', " + filme.getAtor().getId() + ", " + filme.getDiretor().getId() + "," + filme.getLancamento().toString()+ "," + filme.getCadastro().toString() );
        int sucess = this.db.Update(sql.toString());
        if (sucess == 1)
        {
            return true;
        }
        return false;
    }

    public FilmeVO buscaFilme(FilmeVO filme)
    {
        SQL sql = Factory.createSQL();
        sql.select("filme_id, categoria_id, filme_nome, filme_enredo, ator_id, diretor_id, filme_lancamento, filme_cadastro")
                .from("filme")
                .where("filme_id = " + filme.getId());
        ResultSet rs = this.db.Execute(sql.toString());
        try
        {
            if ( ! rs.wasNull() )
            {
                filme.setId(rs.getInt("filme_id"));
                int categoria = rs.getInt("categoria_id");
                CategoriaVO categoriaVO = new CategoriaVO();
                categoriaVO.setId(categoria);
                CategoriaDAO categoriaDAO = new CategoriaDAO();
                categoriaVO = categoriaDAO.buscaCategoria(categoriaVO);
                filme.setCategoria(categoriaVO);
                filme.setNome(rs.getString("filme_nome"));
                int ator = rs.getInt("ator_id");
                AtorVO atorVO = new AtorVO();
                atorVO.setId(ator);
                AtorDAO atorDAO = new AtorDAO();
                atorVO = atorDAO.buscaAtor(atorVO);
                filme.setAtor(atorVO);
                int diretor = rs.getInt("diretor_id");
                DiretorVO diretorVO = new DiretorVO();
                diretorVO.setId(diretor);
                DiretorDAO diretorDAO = new DiretorDAO();
                diretorVO = diretorDAO.buscaDiretor(diretorVO);
                filme.setDiretor(diretorVO);
                filme.setEnredo(rs.getString("filme_enredo"));
                filme.setLancamento(rs.getDate("filme_lancamento"));
                filme.setCadastro(rs.getDate("filme_cadastro"));
                return filme;
            }
        }
        catch( SQLException e )
        {
            ErrorLog.SQLLog("Error Main method " , e);
        }
        return null;
    }

    public boolean alteraFilme(FilmeVO filme)
    {
        SQL sql = Factory.createSQL();
        sql.update("filme")
                .set("categoria_id = " + filme.getCategoria().getId())
                .nset("filme_nome = " + filme.getNome())
                .nset("ator_id = " + filme.getAtor().getAtorId())
                .nset("diretor_id = " + filme.getDiretor().getDiretorId())
                .nset("filme_enredo = " + filme.getEnredo())
                .nset("filme_lancamento = " + filme.getLancamento())
                .where("filme_id = " + filme.getId());
        int sucess =  this.db.Update(sql.toString());
        if (sucess == 1)
        {
            return true;
        }
        return false;
    }

    public boolean apagaFilme(FilmeVO filme)
    {
        SQL sql = Factory.createSQL();
        sql = sql.delete("filme")
                .where("filme_id = " + filme.getId());
        int sucess = this.db.Update(sql.toString());
        if (sucess == 1){
            return true;
        }
        return false;
    }

}
